package gases.as3.librarys.core.net.cpp.bytes
{
	import gases.as3.librarys.core.net.socket.SocketUtil;
	import gases.as3.librarys.core.utils.math.util.Int64Util;
	
	import flash.utils.ByteArray;

	public class BytesUtil
	{
		
		/**
		 * 读取 
		 * @param key 为了方便区别和识别,所使用的标识KEY
		 * @param bytes 读取数据来源
		 * @param type 需要读取的类型
		 * @param length 读取的长度
		 * @return 读取的内容值
		 * 
		 */		
		public static function read(key:String, bytes:ByteArray,type:String,length:int):*
		{
			var value:*;
			var ba:ByteArray;
			switch(type)
			{
				case BytesType.BOOL:
					value = bytes.readBoolean();
					break;
				
				case BytesType.BYTE:
					value = bytes.readByte();
					break;
				
				case BytesType.BYTES:
					ba = new ByteArray();
					bytes.readBytes(ba, 0, length);
					value = ba;
					break;
				
				case BytesType.CHAR:
					var cp:int = bytes.position;
					value = bytes.readMultiByte(length, 'gb2312');
					bytes.position = cp + length;
					break;
				
				case BytesType.INT:
					value = SocketUtil.readInt(bytes);
					break;
				
				case BytesType.INT64:
					ba = new ByteArray();
					bytes.readBytes(ba, 0, length);
					value = Int64Util.getInt64Key(ba);
					break;
				
				case BytesType.SHORT:
					value = SocketUtil.readShort(bytes);
					break;
				
				case BytesType.INT64_NUMBER:
					value = SocketUtil.readInt64(bytes);
					break;
			}
			return value;
		}
		
		/**
		 * 用一个特定函数来读取一个对象 
		 * @param key 为了方便区别和识别,所使用的标识KEY
		 * @param bytes 读取目标源
		 * @param func 读取调用的编码函数
		 * @return 读取的内容值
		 * 
		 */		
		public static function readVO(key:String, bytes:ByteArray, func:Function):Object
		{
			if(func != null)
			{
				return func(bytes);
			}
			return null;
		}
		
		/**
		 * 调用一个既定函数,写入一个VO对象 
		 * @param key 为了方便区别和识别,所使用的标识KEY
		 * @param bytes 写入目标数据源
		 * @param func 写入调用的编码函数
		 * @param value 读取的内容值
		 * 
		 */		
		public static function writeVO(key:String, bytes:ByteArray, func:Function, value:Object):void
		{
			if(func != null && value != null)
			{
				func(bytes, value);
			}
		}
		
		/**
		 * 写入 
		 * @param key 为了方便区别和识别,所使用的标识KEY
		 * @param bytes 写入目标数据源
		 * @param type 类型
		 * @param length 长度
		 * @param value 值
		 * 
		 */		
		public static function write(key:String, bytes:ByteArray, type:String, length:int, value:*):void
		{
			switch(type)
			{
				case BytesType.BOOL:
					bytes.writeBoolean(value);
					break;
				
				case BytesType.BYTE:
					bytes.writeByte(value);
					break;
				
				case BytesType.BYTES:
					if(value is ByteArray)
					{
						bytes.writeBytes(value);
					}
					break;
				
				case BytesType.CHAR:
					var cp : int = bytes.position;
					if(value)
						bytes.writeMultiByte(value, 'gb2312');
					if(bytes.position < cp + length)
					{
						bytes.position = cp + length - 1;
						bytes.writeByte(0);
					}
					break;
				
				case BytesType.INT:
					SocketUtil.writeInt(value, bytes);
					break;
				
				case BytesType.INT64:
					var ba:ByteArray = Int64Util.getInt64ByteArray(String(value));
					bytes.writeBytes(ba);
					break;
				
				case BytesType.SHORT:
					SocketUtil.writeShort(value,bytes);
					break;
				
				case BytesType.INT64_NUMBER_LENGTH:
					SocketUtil.writeInt64(value,bytes);
					break;
			}
		}
	}
}